/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.uca.dss.curso2011.grupo1.interfaz;


import java.util.List;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.uca.dss.curso2011.grupo1.clases.Hora;
import org.uca.dss.curso2011.grupo1.clases.InformacionReserva;
import org.uca.dss.curso2011.grupo1.clases.Reserva;
import org.uca.dss.curso2011.grupo1.clases.ControlaReserva;
import org.uca.dss.curso2011.grupo1.clases.RepartoAsientos;


/**
 * Clase que implementa la interfaz de compras.
 * @author Alejandro & David
 */
public class Compras implements InterfazCompras {
    
    private Estado estado;
    private RepartoAsientos repartoasientos;
    private List<InformacionReserva> informacionReservas;

    /**
     * Constructor de la clase Compras.
     * @param horas Listado de las horas de los trayectos.
     * @param reservas Listado de las reservas del sistema.
     * @param informacionesReservas Listado de las informaciones de reservas del sistema.
     * @param repartoAsientos Critero de asignación de los asientos.
     */
    public Compras(List<Hora> horas, List<Reserva> reservas, List<InformacionReserva> informacionesReservas,RepartoAsientos repartoAsientos){

       this.informacionReservas = informacionesReservas;

       this.estado = new Estado(horas, reservas);

       this.repartoasientos = repartoAsientos;
    }

    /**
     * Función que realiza la reserva de un viaje.
     * @param origen Ciudad de origen del trayecto.
     * @param destino Ciudad destino del trayecto.
     * @param fecha Fecha de realización del viaje.
     * @param hora Hora de salida del trayecto.
     * @return el código de reserva del viaje.
     */
    public String reservaAsiento(String origen, String destino, LocalDate fecha, LocalTime hora) {
            ControlaReserva reservacontrol = new ControlaReserva(estado.obtieneHoras(),estado.obtieneReservas(), this.informacionReservas, this.repartoasientos);
            return reservacontrol.reservaAsiento(origen, destino, fecha, hora);
    }

    /**
     * Función que cancela una reserva.
     * @param codigoReserva Código de reserva del viaje.
     */
    public void cancelaReserva(String codigoReserva) {
            ControlaReserva reservacontrol = new ControlaReserva(estado.obtieneHoras(), estado.obtieneReservas(), this.informacionReservas, this.repartoasientos);
            reservacontrol.cancelaReserva(codigoReserva);
    }

    /**
     * Función que obtiene el precio de un viaje.
     * @param origen Ciudad de origen del trayecto.
     * @param destino Ciudad destino del trayecto.
     * @param fecha Fecha en la que se realiza el viaje.
     * @param hora Hora de salida del viaje.
     * @return El precio del viaje.
     */
    public double getPrecio(String origen, String destino, LocalDate fecha, LocalTime hora){
            ControlaReserva reservacontrol = new ControlaReserva(estado.obtieneHoras(), estado.obtieneReservas(), this.informacionReservas, this.repartoasientos);
            return reservacontrol.obtienePrecio(origen, destino, fecha, hora);
    }

    /**
     * Función que obtiene el número de asientos libres para un viaje concreto.
     * @param origen Ciudad de origen del viaje.
     * @param destino Ciudad destino del viaje.
     * @param fecha Fecha en la que se realiza el viaje.
     * @param hora Hora de salida del viaje.
     * @return El número de asientos libres del viaje indicado.
     */
    public int asientosLibres(String origen, String destino, LocalDate fecha, LocalTime hora) {
        ControlaReserva reservacontrol = new ControlaReserva(estado.obtieneHoras(),estado.obtieneReservas(), this.informacionReservas, this.repartoasientos);
        return reservacontrol.asientosLibres(origen, destino, fecha, hora);
    }

}
